chore(evals): migrate agent behavioral conformance from beval to Vally - #2552
Open
vyta wants to merge 1 commit into
Open
chore(evals): migrate agent behavioral conformance from beval to Vally#2552vyta wants to merge 1 commit into
vyta wants to merge 1 commit into
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #2552 +/- ##
==========================================
- Coverage 82.75% 82.74% -0.01%
==========================================
Files 155 155
Lines 20960 20960
Branches 13 13
==========================================
- Hits 17345 17344 -1
- Misses 3613 3614 +1
Partials 2 2
Flags with carried forward coverage won't be shown. Click here to find out more. 🚀 New features to boost your workflow:
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pull Request
Description
The
bevalharness was the only evaluation system in this repository that did not run on Vally. It carried its ownpackage.jsonand lockfile underevals/beval/, its own workflow, and its own assertion vocabulary. This PR retires it and rebuilds the behavioral conformance coverage as six native Vally suites, so agent conformance, skill quality, agent behavior, and script validation all share one runner, one spec schema, and one reporting path.What lands
Six new suites under
evals/agent-conformance/, one per planner agent (accessibility, dt-coach, privacy, rai, security, sssc), totaling 80 stimuli. Each stimulus is two turns: turn 0 launches the agent artifact, turn 1 delivers the case, and a model judge grades turn 1 against a per-stimulus rubric. Awall-timegrader carries an advisory latency budget, and four dt-coach-family suites add anoutput-containsgrader..github/workflows/agent-conformance.ymlruns the suites as afail-fast: falsematrix, invoked byweekly-validation.ymlon the Monday schedule.evals/beval/**and.github/workflows/beval.ymlare deleted.Scoring semantics were corrected, not carried over
This is the substantive fix in the migration and worth reviewer attention.
The beval specs used
case_pass: 0.5, which meant the fraction of assertions within a case that must pass — a meaningful number when a case carried several assertions. The first draft of these Vally specs carried0.5forward intoscoring.threshold, but in Vallythresholdis the aggregate score across graders for a single stimulus.Vally 0.9.0's
computeWeightedScoreequal-averages whenscoring.weightsis absent, andresolveGradePassisscore >= threshold. With two graders, a judge score of0plus a wall-time pass yields(0 + 1) / 2 = 0.5, which clears a0.5threshold. Every one of the 80 stimuli would have passed simply by responding within 120 seconds, regardless of what the agent said.Each suite now declares explicit weights that sum to
1.0, with the threshold set so the judge alone is decisive:The three-grader suites use
prompt: 0.7 / wall-time: 0.15 / output-contains: 0.15withthreshold: 0.7. Verification of this behavior is described under Testing.Supporting cleanup
package.json— removed theaudit:npm:bevalscript, which pointed at the deletedevals/beval/package root and would have failed on the nextnpm run audit:npm(invoked bypr-validation.yml)..github/instructions/ci-owned-validation.instructions.md— retargetedapplyTofrom the deletedbeval.ymltoagent-conformance.ymland rewrote the corresponding body rule.docs/contributing/validation.md— dropped theevals/bevalpackage-root row, added an agent-conformance lane row, and replaced the## Beval workflowsection with## Agent conformance workflow.evals/README.md— addedagent-conformance/to the architecture tree and the executor table, plus run commands.docs/planning/adrs/0002-adopt-vally-as-agent-and-skill-behavior-evaluation-framework.md—ms.daterefreshed.Related Issue(s)
Fixes #2479
Type of Change
Select all that apply:
Code & Documentation:
Infrastructure & Configuration:
AI Artifacts:
hve-builderand addressed all actionable findings.github/instructions/*.instructions.md).github/prompts/*.prompt.md).github/agents/*.agent.md).github/skills/*/SKILL.md).github/hooks/*/*.json)evals/)Other:
.ps1,.sh,.py)Testing
All commands below ran in throwaway containers with no network access.
Static validation — passing:
npx vally lint --eval-spec evals/regression-without-baselinewarnings (see Additional Notes). Noscoring-weight-sumerror and noscoring-weight-coveragewarning, which is Vally's own validator confirming the weights sum to 1.0 and that the declared grader types match those actually used.scripts/evals/Test-EvalSpec.ps1markdownlint-cli2on changed docsValidate-MarkdownFrontmatter.ps1 -WarningsAsErrors -EnableSchemaValidationmarkdown-table-formatterdocs/contributing/validation.md.Scoring verification — executed, not inferred:
Because the scoring defect above was silent under static analysis, it was verified by execution rather than by reading. A throwaway script imported the installed Vally 0.9.0
gradeTrajectory,createGraderRegistry, andresolveGradePass, registered stub graders with scripted scores, and read the realweightsandthresholdout of each committedeval.yaml. Across all 80 stimuli:threshold: 0.5) → PASS at 0.500 even with a failing judgeThe judge is decisive for every stimulus in the suite. The script was deleted afterward and is not part of this PR.
Checklist
Required Checks
AI Artifact Contributions
hve-builderreview mode to review contributionhve-builderreviewRequired Local Checks
The following local-safe validation commands must pass before merging:
npm run validate:localnpm run validate:docsnpm run spell-checknpm run lint:md-linksSecurity Considerations
evals/beval/package.jsonand its lockfile are removed)scripts/security/changes)Additional Notes